home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 13 / CU Amiga Magazine's Super CD-ROM 13 (1997)(EMAP Images)(GB)(Track 1 of 2)[!][issue 1997-08].iso / CUCD / Graphics / Ghostscript / data / gs_pdf.ps < prev    next >
Text File  |  1997-04-12  |  17KB  |  571 lines

  1. %    Copyright (C) 1994, 1996 Aladdin Enterprises.  All rights reserved.
  2. % This file is part of Aladdin Ghostscript.
  3. % Aladdin Ghostscript is distributed with NO WARRANTY OF ANY KIND.  No author
  4. % or distributor accepts any responsibility for the consequences of using it,
  5. % or for whether it serves any particular purpose or works at all, unless he
  6. % or she says so in writing.  Refer to the Aladdin Ghostscript Free Public
  7. % License (the "License") for full details.
  8. % Every copy of Aladdin Ghostscript must include a copy of the License,
  9. % normally in a plain ASCII text file named PUBLIC.  The License grants you
  10. % the right to copy, modify and redistribute Aladdin Ghostscript, but only
  11. % under certain conditions described in the License.  Among other things, the
  12. % License requires that the copyright notice and this notice be preserved on
  13. % all copies.
  14.  
  15. % gs_pdf.ps
  16. % ProcSet for PostScript files created by the PDF to PostScript converter.
  17. % This ProcSet requires only a Level 1 interpreter.
  18.  
  19. % pdf2ps copies this file from %BEGIN to the end.
  20.  
  21. %BEGIN
  22. mark                % patches
  23. /currentglobal { false }
  24. /setglobal { pop }
  25. /packedarray { array astore readonly }
  26. /setcmykcolor
  27.  { 1 exch sub
  28.    4 -1 roll 1 exch sub 1 index mul
  29.    4 -1 roll 1 exch sub 2 index mul
  30.    4 -2 roll exch 1 exch sub mul
  31.    setrgbcolor
  32.  }
  33. /.copydict
  34.  { dup 3 -1 roll { put dup } forall pop }
  35. /.dicttomark
  36.  { counttomark 2 idiv dup dict begin { def } repeat pop currentdict end }
  37. /.knownget
  38.  { 2 copy known { get true } { pop pop false } ifelse }
  39. counttomark 2 idiv
  40.  { 1 index where { pop pop pop } { bind executeonly def } ifelse
  41.  } repeat pop
  42.  
  43. currentglobal true setglobal
  44.  
  45. % Define pdfmark.  Don't allow it to be bound in.
  46. % Also don't define it in systemdict, because this leads some Adobe code
  47. % to think this interpreter is a distiller.
  48. % (If this interpreter really is a distiller, don't do this.)
  49. systemdict /pdfmark known not
  50.  { userdict /pdfmark { cleartomark } bind put } if
  51.  
  52. % This ProcSet is designed so that it can be used either to execute PDF
  53. % (the default) or to convert PDF to PostScript.  See ! and ~ below.
  54.  
  55. userdict /GS_PDF_ProcSet 119 dict dup begin
  56.  
  57. % ---------------- Abbreviations ---------------- %
  58.  
  59. /bdef { bind def } bind def
  60.  
  61. % ---------------- Operator execution ---------------- %
  62.  
  63. % We record "operator" names in a dictionary with their argument counts,
  64. % so that they can easily be redefined later to write PostScript in
  65. % addition to (or instead of) being executed.
  66.  
  67. /numargsdict 100 dict def
  68. /!        % <procname> <proc> <numargs> ! -
  69.  { //numargsdict 3 index 3 -1 roll put def
  70.  } bdef
  71. /~        % <procname> <opname> <numargs> ~ -
  72.  { exch cvx 1 packedarray cvx exch !
  73.  } bdef
  74.  
  75. % ---------------- Graphics state stack ---------------- %
  76.  
  77. % PDF adds a number of parameters to the graphics state.
  78. % We implement this by pushing and popping a dictionary
  79. % each time we do a PDF gsave or grestore.
  80. % The keys in this dictionary are as follows:
  81. %    self            % identifies the dictionary as one of ours
  82. %    Show
  83. %    TextOrigin        % origin of current line, in text space
  84. %    TextSaveMatrix        % matrix at time of BT
  85. % (The following correspond directly to PDF state parameters.)
  86. %    FillColor
  87. %    FillColorSpace
  88. %    StrokeColor
  89. %    StrokeColorSpace
  90. %    TextSpacing
  91. %    TextHScaling
  92. %    Leading
  93. %    TextFont
  94. %    TextMatrix
  95. %    TextRise
  96. %    TextRenderingMode
  97. %    WordSpacing
  98.  
  99. /nodict 1 dict def
  100. nodict /self { //nodict } executeonly put
  101. nodict readonly pop
  102.  
  103. /beginpage
  104.  { //nodict 20 dict .copydict begin graphicsbeginpage textbeginpage
  105.  } bdef
  106. /endpage
  107.  { showpage end
  108.  } bdef
  109.  
  110. /graphicsbeginpage { initgraphics  0 g  0 G } bdef
  111.  
  112. /gput        % <value> <key> gput -
  113.  { exch currentdict //nodict eq { /self dup load end 5 dict begin def } if
  114.         % If we're in a Level 1 system, we need to grow the
  115.         % dictionary explicitly.
  116.    currentdict length currentdict maxlength ge %eq
  117.     { currentdict dup length 3 mul 2 idiv 1 add dict .copydict end begin 
  118.     }
  119.    if def
  120.  } bdef
  121.  
  122. /q_
  123.  { gsave //nodict begin
  124.  } bdef
  125. /q /q_ load 0 !
  126. % Some PDF files have excess Q operators!
  127. /Q_
  128.  { currentdict /self .knownget { exec //nodict eq { end grestore } if } if
  129.  } bdef
  130. /Q /Q_ load 0 !
  131.  
  132. % ---------------- Graphics state parameters ---------------- %
  133.  
  134. /d /setdash 2 ~
  135. /i /setflat 1 ~
  136. /j /setlinejoin 1 ~
  137. /J /setlinecap 1 ~
  138. /M /setmiterlimit 1 ~
  139. /w /setlinewidth 1 ~
  140.  
  141. % ---------------- Color setting ---------------- %
  142.  
  143. /fcput        % <color> <colorspace> fcput -
  144.  { /FillColorSpace gput /FillColor gput
  145.  } bdef
  146. /scput        % <color> <colorspace> scput -
  147.  { /StrokeColorSpace gput /StrokeColor gput
  148.  } bdef
  149.  
  150. /csdevgray [/DeviceGray] readonly def
  151. /csdevrgb [/DeviceRGB] readonly def
  152. /csdevcmyk [/DeviceCMYK] readonly def
  153.  
  154. /CSdict 11 dict dup begin
  155.   /DeviceGray { 0 exch } bdef
  156.   /DeviceRGB { [0 0 0] cvx exch } bdef
  157.   /DeviceCMYK { [0 0 0 1] cvx exch } bdef
  158.   /Indexed
  159.    { dup 1 get csset exch pop
  160.      dup 2 index 1 get eq
  161.       { pop }
  162.       { exch 4 array copy dup 1 4 -1 roll put }
  163.      ifelse 0 exch
  164.     } bdef
  165.   /setcolorrendering where
  166.    { pop
  167.      /CalGray
  168.       { 1 get dup /Gamma .knownget
  169.      { dup length 1 add dict .copydict
  170.        dup /DecodeA 4 -1 roll /exp load 2 packedarray cvx put
  171.          }
  172.     if /CIEBasedA exch 2 array astore 0 exch
  173.       } bdef
  174.      /CalRGB
  175.       { 1 get dup /Gamma known 1 index /Matrix known or
  176.      { dup length 2 add dict .copydict
  177.        dup /Matrix .knownget { 1 index /MatrixABC 3 -1 roll put } if
  178.        dup /Gamma .knownget
  179.         { [ exch { /exp load 2 packedarray cvx } forall
  180.           ] 1 index /DecodeABC 3 -1 roll put
  181.         }
  182.        if
  183.          }
  184.     if /CIEBasedABC exch 2 array astore [0 0 0] cvx exch
  185.       } bdef
  186.      /CalCMYK { pop //csdevcmyk csset } bdef    % not supported yet
  187.    }
  188.    { /CalGray { pop //csdevgray csset } bdef
  189.      /CalRGB { pop //csdevrgb csset } bdef
  190.      /CalCMYK { pop //csdevcmyk csset } bdef
  191.    }
  192.   ifelse
  193. end def
  194. /csset            % <cspace> csset <color> <cspace>
  195.  { dup dup type /nametype ne { 0 get } if //CSdict exch get exec
  196.  } bdef
  197.  
  198. /g { //csdevgray fcput } 1 !
  199. /G { //csdevgray scput } 1 !
  200. /rg { 3 array astore cvx //csdevrgb fcput } 3 !
  201. /RG { 3 array astore cvx //csdevrgb scput } 3 !
  202. /k { 4 array astore cvx //csdevcmyk fcput } 4 !
  203. /K { 4 array astore cvx //csdevcmyk scput } 4 !
  204. /cs { csset fcput } 1 !
  205. /CS { csset scput } 1 !
  206. % We have to break up sc according to the number of operands.
  207. /sc1 { /FillColor gput } 1 !
  208. /SC1 { /StrokeColor gput } 1 !
  209. /sc3 { /FillColor load astore pop } 3 !
  210. /SC3 { /StrokeColor load astore pop } 3 !
  211. /sc4 { /FillColor load astore pop } 4 !
  212. /SC4 { /StrokeColor load astore pop } 4 !
  213.  
  214. % ---------------- Color installation ---------------- %
  215.  
  216. % Establish a given color (and color space) as current.
  217. /setfillcolor { FillColor FillColorSpace setgcolor } def
  218. /setstrokecolor { StrokeColor StrokeColorSpace setgcolor } def
  219. /CIdict mark            % only used for Level 1
  220.   /DeviceGray 1   /DeviceRGB 3   /DeviceCMYK 4
  221.   /CIEBaseA 1   /CIEBaseABC 3   /CIEBasedDEF 3   /CIEBaseDEFG 4
  222. .dicttomark def
  223. /Cdict 11 dict dup begin    % <color...> <colorspace> -proc- -
  224.   /DeviceGray { pop setgray } bdef
  225.   /DeviceRGB { pop setrgbcolor } bdef
  226.   /DeviceCMYK { pop setcmykcolor } bdef
  227.   /CIEBasedA
  228.    { dup currentcolorspace eq { pop } { setcolorspace } ifelse setcolor } bdef
  229.   /CIEBasedABC /CIEBasedA load def
  230.   /CIEBasedDEF /CIEBasedA load def
  231.   /CIEBasedDEFG /CIEBasedA load def
  232.   /Indexed /setcolorspace where
  233.    { pop /CIEBasedA load }
  234.    { /setindexedcolor cvx }
  235.   ifelse def
  236. end def
  237. /setindexedcolor        % <index> [/Indexed base hival proc|str]
  238.                 %   setindexedcolor - (only used for Level 1)
  239.  { mark 3 -1 roll
  240.    2 index 3 get    % Stack: cspace -mark- index proc|str
  241.    dup type /stringtype eq
  242.     { //CIdict 4 index 1 get 0 get get        % # of components
  243.       dup 4 -1 roll mul exch getinterval { 255 div } forall
  244.     }
  245.     { exec
  246.     }
  247.    ifelse
  248.    counttomark 2 add -2 roll pop
  249.    1 get setgcolor
  250.  } bdef
  251. /setgcolor    % (null | <color...>) <colorspace> setgcolor -
  252.  { 1 index null eq
  253.     { pop pop }
  254.     { dup 0 get //Cdict exch get exec }
  255.    ifelse
  256.  } bdef
  257. /fsexec        % <fillop|strokeop> fsexec -
  258.  {        % Preserve the current point, if any.
  259.     { currentpoint } stopped
  260.     { $error /newerror false put   cvx exec }
  261.     { 3 -1 roll cvx exec moveto }
  262.    ifelse
  263.  } bdef
  264.  
  265. % ---------------- Transformations ---------------- %
  266.  
  267. /cmmatrix matrix def
  268. /cm { //cmmatrix astore concat } 6 !
  269.  
  270. % ---------------- Path creation ---------------- %
  271.  
  272. /m /moveto 2 ~
  273. /l /lineto 2 ~
  274. /c /curveto 6 ~
  275. /h /closepath 0 ~
  276. /v { currentpoint 6 2 roll curveto } 4 !
  277. /y { 2 copy curveto } 4 !
  278. /re
  279.  { 4 2 roll moveto  exch dup 0 rlineto  0 3 -1 roll rlineto  neg 0 rlineto
  280.    closepath
  281.  } 4 !
  282.  
  283. % ---------------- Path painting and clipping ---------------- %
  284.  
  285. /S_ { setstrokecolor /stroke fsexec } bdef
  286. /S { S_ } 0 !
  287. /f { setfillcolor /fill fsexec } 0 !
  288. /f* { setfillcolor /eofill fsexec } 0 !
  289. /n_ { newpath } bdef        % don't allow n_ to get bound in
  290. /n { n_ } 0 !
  291. /s { closepath S_ } 0 !
  292. /B_ { gsave setfillcolor fill grestore S_ } bdef
  293. /B /B_ load 0 !
  294. /b { closepath B_ } 0 !
  295. /B*_ { gsave setfillcolor eofill grestore S_ } bdef
  296. /B* /B*_ load 0 !
  297. /b* { closepath B*_ } 0 !
  298.  
  299. % Clipping:
  300.  
  301. /Wdict 4 dict dup begin
  302. /S_ { gsave setstrokecolor stroke grestore n_ } bdef
  303. /f { gsave setfillcolor fill grestore n_ } 0 !
  304. /f* { gsave setfillcolor eofill grestore n_ } 0 !
  305. /n_ { end clip newpath } bdef
  306. end readonly def
  307. /W { //Wdict begin } 0 !
  308. /W*dict 4 dict dup begin
  309. /S_ { gsave setstrokecolor stroke grestore n_ } bdef
  310. /f { gsave setfillcolor fill grestore n_ } 0 !
  311. /f* { gsave setfillcolor eofill grestore n_ } 0 !
  312. /n_ { end eoclip newpath } bdef
  313. end readonly def
  314. /W* { //W*dict begin } 0 !
  315.  
  316. % ---------------- Images ---------------- %
  317.  
  318. % We mustn't bind these now, since they reference Level 2 operators.
  319. /Is        % <imagedict> Is <imagedict> <datasource>
  320.  { dup /DataSource get string /readstring cvx /currentfile cvx
  321.         % Stack: imagedict string -readstring- -currentfile-
  322.    3 index /FilterProc .knownget
  323.     { dup dup 0 get /ASCIIHexDecode eq exch length 2 eq and
  324.        { pop exch pop /readhexstring cvx exch }
  325.        { exch exec exch exec }
  326.       ifelse
  327.     }
  328.    if 3 1 roll /pop cvx 4 packedarray cvx
  329.  } bdef
  330. /EI { } def    % placeholder, only needed when writing PostScript
  331. % Note that ID* take a dictionary, not separate values;
  332. % ColorSpace must be a name if it has no parameters;
  333. % DataSource is the size of the row buffer in bytes;
  334. % FilterProc is an optional procedure for constructing the decoding filter;
  335. % and ImageMask is required, not optional.
  336. /csimage
  337.  { /setcolorspace where
  338.     { pop dup /ColorSpace get csset setcolorspace pop image }
  339.     { .colorspaceimage }
  340.    ifelse
  341.  } def        % don't bind, because of Level 2
  342. /ID    % <imagedict> ID -
  343.  { Is dup 3 -1 roll dup /ImageMask get
  344.     { setfillcolor dup /Interpolate .knownget not { false } if
  345.        { dup /DataSource 4 -1 roll put /imagemask cvx exec
  346.        }
  347.        {  { /Width /Height /Decode /ImageMatrix }
  348.       { 1 index exch get exch }
  349.      forall pop exch 0 get 0 ne exch
  350.      5 -1 roll imagemask
  351.        }
  352.       ifelse
  353.     }
  354.     { dup /ColorSpace get /DeviceGray eq
  355.       1 index /BitsPerComponent get 8 le and
  356.       1 index /Decode get dup 1 get 1 eq exch 0 get 0 eq and and
  357.       1 index /Interpolate .knownget not { false } if not and
  358.        {  { /Width /Height /BitsPerComponent /ImageMatrix }
  359.       { 1 index exch get exch }
  360.      forall pop 5 -1 roll image
  361.        }
  362.        { dup /DataSource 4 -1 roll put csimage
  363.        }
  364.       ifelse
  365.     }
  366.    ifelse
  367.         % If we were reading with readhexstring,
  368.         % skip the terminating > now.
  369.         % Stack: datasource
  370.    dup type /filetype ne        % array or packedarray
  371.     { dup 2 get /readhexstring eq
  372.        {  { dup 0 get exec read pop (>) 0 get eq { exit } if } loop
  373.        }
  374.       if pop
  375.     }
  376.     { pop
  377.     }
  378.    ifelse EI
  379.  } 1 !
  380. % IDx handles general images.
  381. /IDx    % <imagedict> IDx -
  382.  { Is 1 index /DataSource 3 -1 roll put
  383.    csimage EI
  384.  } 1 !
  385.  
  386. % ---------------- Text control ---------------- %
  387.  
  388. /textbeginpage
  389.  { /TextSpacing 0 def        % 0 Tc
  390.    /TextLeading 0 def        % 0 TL
  391.    /TextRenderingMode 0 def    % 0 Tr
  392.    /TextRise 0 def        % 0 Ts
  393.    /WordSpacing 0 def        % 0 Tw
  394.    /TextHScaling 1.0 def    % 100 Tz
  395.    /TextFont null def
  396.    /Show { showfirst } def
  397.  } bdef
  398.  
  399. % Contrary to the statement in the PDF manual, BT and ET *can* be nested,
  400. % if the CharProc for a Type 3 font does a BT/ET itself.
  401. % Since we always call the CharProc inside a q_/Q_, we simply ensure that
  402. % the text state is saved and restored like the rest of the extended
  403. % graphics state.
  404.  
  405. /settextmatrix
  406.  { TextMatrix concat
  407.    TextHScaling 1 ne { TextHScaling 1 scale } if
  408.    TextRise 0 ne { 0 TextRise translate } if
  409.  } bdef
  410. /settextstate { TextSaveMatrix setmatrix settextmatrix } bdef
  411.  
  412. /BT
  413.  { currentdict /TextMatrix .knownget
  414.     { identmatrix pop }
  415.     { matrix /TextMatrix gput }
  416.    ifelse
  417.    currentdict /TextOrigin .knownget
  418.     { dup 0 0 put 1 0 put }
  419.     { [0 0] cvx /TextOrigin gput }
  420.    ifelse
  421.     { showfirst } /Show gput
  422.    currentdict /TextSaveMatrix .knownget not
  423.     { matrix dup /TextSaveMatrix gput }
  424.    if currentmatrix pop settextmatrix 0 0 moveto
  425.    TextFont dup null eq { pop } { setfont } ifelse
  426.  } bind 0 !
  427. /ET
  428.  { TextSaveMatrix setmatrix
  429.  } bind 0 !
  430. /Tc_ { /TextSpacing gput { showfirst } /Show gput } bdef
  431. /Tc { Tc_ } 1 !
  432. /TL { /TextLeading gput } bind 1 !
  433. /Tr { /TextRenderingMode gput { showfirst } /Show gput } bind 1 !
  434. /Ts { /TextRise gput settextstate } bind 1 !
  435. /Tw_ { /WordSpacing gput { showfirst } /Show gput } bdef
  436. /Tw { Tw_ } 1 !
  437. /Tz { 100 div /TextHScaling gput settextstate } bind 1 !
  438.  
  439. /Tf        % <font> <scale> Tf -
  440.  { dup 1 eq { pop } { scalefont } ifelse
  441.    dup setfont /TextFont gput
  442.  } 2 !
  443.  
  444. % Copy a font, removing its FID.  If changed is true, also remove
  445. % the UniqueID and XUID, if any.  If the original dictionary doesn't have
  446. % the keys being removed, don't copy it.
  447. /.copyfontdict        % <font> <changed> .copyfontdict <dict>
  448.  { 1 index /FID known
  449.    1 index { 2 index /UniqueID known or 2 index /XUID known or } if
  450.     {        % We add 1 to the length just in case the original
  451.         % didn't have a FID.
  452.       exch dup length 1 add dict exch
  453.        {        % Stack: changed newfont key value
  454.      1 index /FID eq 4 index
  455.       { 2 index /UniqueID eq or 2 index /XUID eq or }
  456.      if not { 3 copy put } if pop pop
  457.        }
  458.       forall exch
  459.     }
  460.    if pop
  461.  } bdef
  462.  
  463. % Insert a new Encoding or Metrics into a font if necessary.
  464. % Return a possibly updated font, and a flag to indicate whether
  465. % the font was actually copied.
  466. /.updatefont        % <font> <Encoding|null> <Metrics|null> .updatefont
  467.             %   <font'> <copied>
  468.  { 2 index 4 1 roll
  469.    dup null ne
  470.     { 3 -1 roll true .copyfontdict dup /Metrics 4 -1 roll put exch }
  471.     { pop }
  472.    ifelse
  473.    dup null ne 1 index 3 index /Encoding get ne and
  474.     { exch false .copyfontdict dup /Encoding 4 -1 roll put }
  475.     { pop }
  476.    ifelse exch 1 index ne
  477.  } bdef
  478.  
  479. % ---------------- Text positioning ---------------- %
  480.  
  481. /Td_
  482.  { TextOrigin exch 4 -1 roll add 3 1 roll add
  483.    2 copy /TextOrigin load astore pop moveto
  484.  } bdef
  485. /Td { Td_ } 2 !
  486. /TD { dup neg /TextLeading gput Td_ } 2 !
  487. /T*_ { 0 TextLeading neg Td_ } bdef
  488. /T* { T*_ } 0 !
  489. /Tm
  490.  { TextMatrix astore pop settextstate
  491.    0 0 /TextOrigin load astore pop
  492.    0 0 moveto
  493.  } 6 !
  494.  
  495. % ---------------- Text painting ---------------- %
  496.  
  497. /textrenderingprocs [        % (0 is handled specially)
  498.    { tf } { tS } { tB } { tn }
  499.     % We don't know what the clipping modes mean....
  500.    4 copy
  501. ] readonly def
  502. /setshowstate
  503.  { WordSpacing 0 eq TextSpacing 0 eq and
  504.     { TextRenderingMode 0 eq
  505.        { { setfillcolor show } }
  506.        { { false charpath textrenderingprocs TextRenderingMode get exec } }
  507.       ifelse
  508.     }
  509.     { TextRenderingMode 0 eq
  510.        { WordSpacing 0 eq
  511.           { { setfillcolor TextSpacing exch 0 exch ashow } }
  512.       { TextSpacing 0 eq
  513.          { { setfillcolor WordSpacing exch 0 exch 32 exch widthshow } }
  514.          { { setfillcolor WordSpacing exch TextSpacing exch 0 32 4 2 roll 0 exch awidthshow } }
  515.         ifelse
  516.       }
  517.      ifelse
  518.        }
  519.        { { WordSpacing TextSpacing 2 index
  520.             % Implement the combination of t3 and false charpath.
  521.             % Stack: xword xchar string
  522.        0 1 2 index length 1 sub
  523.         { 2 copy 1 getinterval false charpath
  524.             % Stack: xword xchar string i
  525.           4 copy get 32 eq { add } { exch pop } ifelse 0 rmoveto
  526.           pop
  527.         }
  528.        for pop pop pop pop
  529.        textrenderingprocs TextRenderingMode get exec
  530.      }
  531.        }
  532.       ifelse
  533.     }
  534.    ifelse /Show gput
  535.  } bdef
  536. /showfirst { setshowstate Show } def
  537.  
  538. /Tj { Show } 1 !
  539. /' { T*_ Show } 1 !
  540. /" { exch Tc_ exch Tw_ T*_ Show } 3 !
  541. % TJ expects a mark followed by arguments, not an array.
  542. /TJ
  543.  { counttomark -1 1
  544.     { -1 roll dup type /stringtype eq
  545.        { Show }
  546.        { neg 1000 div 0 rmoveto }
  547.       ifelse
  548.     }
  549.    for pop
  550. % Adobe implementations don't accept /[, so we don't either.
  551.  } ([) cvn !
  552.  
  553. /tf { setfillcolor currentpoint fill moveto } bdef
  554. /tn { currentpoint newpath moveto } bdef
  555. % For stroking characters, temporarily restore the graphics CTM so that
  556. % the line width will be transformed properly.
  557. /Tmatrix matrix def
  558. /tS
  559.  { setstrokecolor
  560.    currentpoint //Tmatrix currentmatrix TextSaveMatrix setmatrix stroke
  561.    setmatrix moveto
  562.  } bdef
  563. /tB { gsave tf grestore tS } bdef
  564.  
  565. end readonly put        % GS_PDF_ProcSet
  566.  
  567. setglobal
  568.